import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _isNumber from "lodash/isNumber";
import _isArray from "lodash/isArray";
import _forEach from "lodash/forEach";
import _cloneDeep from "lodash/cloneDeep";
import DataType from "../DataType";
import { defaultFormCol, emptyField, emptyFieldType } from "../config";
import { commonParseForField } from "./common";
/**
 * @param {object} template
 * @return {object} 将初始化的 template 转为 设计器 适用的数据
 */

function dynamicFormInitExtra(template, options) {
  var noCloneDeep = options && options.noCloneDeep;
  var newTemplate = noCloneDeep ? template : _cloneDeep(template); // todo 删除表格多余的属性

  var newFields = []; // 查找 form 的 col 属性

  var col;

  _forEach(newTemplate.config, function (prop) {
    if (prop.attributeName === 'col') {
      col = prop.value;
      return false;
    }
  });

  col = col || defaultFormCol;
  var row = []; // 如果没有字段, 则将 第一行 都补上空字段

  for (var index = 0; index < col; index += 1) {
    row.push(_cloneDeep(emptyField));
  }

  newFields.push(row);
  return _objectSpread(_objectSpread({}, newTemplate), {}, {
    fields: newFields
  });
}
/**
 * 将 存储的 dynamicForm 转换成 设计器 可以识别的
 * 认为组件的 col 和 组件字段的 leftOffset 与 rightOffset 对得上
 * @param {object} template - 新增 或 从服务器查询出来的 dynamicForm
 * @return {object} newTemplate 新的为设计器准备好的字段
 */


function dynamicFormDirtyExtra(template, options) {
  var noCloneDeep = options && options.noCloneDeep;
  var newTemplate = noCloneDeep ? template : _cloneDeep(template); // todo 删除表格多余的属性

  var newFields = []; // 查找 form 的 col 属性

  var col;

  _forEach(newTemplate.config, function (prop) {
    if (prop.attributeName === 'col') {
      col = prop.value;
      return false;
    }
  });

  col = col || defaultFormCol;
  var walkerCount = 0;
  var row = [];

  _forEach(newTemplate.fields, function (field) {
    var fieldWalkerCount = 0;

    if (_isNumber(field.leftOffset)) {
      // 字段的左空位 其实就是编辑时候的空字段
      // 在字段有左空位的时候 补 空字段
      while (fieldWalkerCount < field.leftOffset) {
        row.push(_cloneDeep(emptyField));
        fieldWalkerCount += 1;
      }
    }

    walkerCount += fieldWalkerCount;
    fieldWalkerCount = 0;
    row.push(field);

    if (_isNumber(field.colspan) && field.colspan) {
      walkerCount += field.colspan;
    } else {
      walkerCount += 1;
    }

    if (_isNumber(field.rightOffset)) {
      // 字段的右空位 其实就是编辑时候的空字段
      // 在字段有右空位的时候 补 空字段
      while (fieldWalkerCount < field.rightOffset) {
        row.push(_cloneDeep(emptyField));
        fieldWalkerCount += 1;
      }
    }

    walkerCount += fieldWalkerCount;

    if (walkerCount >= col) {
      // 将 表单的 字段 转换成 二维数组
      newFields.push(row);
      row = [];
      walkerCount = 0;
    }
  }); // 也许数据库中出现问题了，leftOffset rightOffset 和字段对不上
  // if(row.length > 0){
  //   newFields.push(row);
  // }


  if (newFields.length === 0) {
    // 如果没有字段, 则将 第一行 都补上空字段
    for (var index = 0; index < col; index += 1) {
      row.push(_cloneDeep(emptyField));
    }

    newFields.push(row);
  }

  return _objectSpread(_objectSpread({}, newTemplate), {}, {
    fields: newFields
  });
}
/**
 * 将 设计器的 dynamicForm 转换成 存储的数据
 * @param {object} template - 设计器的数据
 * @return {object} newTemplate 准备存储的数据
 */


function dynamicFormDirtyParse(template, options) {
  var noCloneDeep = options && options.noCloneDeep;
  var newTemplate = noCloneDeep ? template : _cloneDeep(template);
  var newFields = []; // 从 第一行列 中 得到新的 col 值

  var col = 0;

  _forEach(newTemplate.fields[0], function (f) {
    if (f.colspan && _isNumber(f.colspan)) {
      col += f.colspan;
    } else {
      col += 1;
    }
  });

  var hasColAttribute = false;

  _forEach(newTemplate.config, function (prop) {
    if (prop.attributeName === 'col') {
      prop.value = col;
      hasColAttribute = true;
      return false;
    }
  });

  if (!hasColAttribute) {
    if (_isArray(newTemplate.config)) {
      newTemplate.config.push({
        attributeName: 'col',
        value: col,
        attributeType: DataType.Number
      });
    } else {
      newTemplate.config = [{
        attributeName: 'col',
        value: col,
        attributeType: DataType.Number
      }];
    }
  } // reset fields, and remove some attr


  var orderSeq = 0;
  var orderSeqStep = 10;

  _forEach(newTemplate.fields, function (fArr) {
    var leftOffset = 0;
    var rightOffset = 0;
    var prevField = null;

    _forEach(fArr, function (f) {
      commonParseForField(newTemplate, f);

      if (f.componentType === emptyFieldType) {
        if (prevField === null) {
          leftOffset += 1;
        } else {
          rightOffset += 1;
        }
      } else {
        f.leftOffset = leftOffset;

        if (prevField !== null) {
          prevField.rightOffset = rightOffset;
        }

        prevField = f;
        leftOffset = 0;
        rightOffset = 0;
        orderSeq += orderSeqStep;
        f.orderSeq = orderSeq;
        newFields.push(f);
      }
    });

    if (prevField !== null) {
      prevField.rightOffset = rightOffset;
    }
  });

  newTemplate.fields = newFields;
  return newTemplate;
}
/**
 * DynamicForm 的 Field 新增 在 组件内部处理
 * @param {object} template
 * @param {object} field
 * @param {object} options
 * @returns
 */
// eslint-disable-next-line no-unused-vars


function dynamicFormInitExtraField(template, field, options) {}

var dynamicForm = {
  initExtra: dynamicFormInitExtra,
  initExtraField: dynamicFormInitExtraField,
  dirtyExtra: dynamicFormDirtyExtra,
  dirtyParse: dynamicFormDirtyParse
};
export default dynamicForm;